home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / TPL60N14.ARJ / FUN1_TST.PAS < prev    next >
Pascal/Delphi Source File  |  1992-05-01  |  7KB  |  242 lines

  1. PROGRAM Fun1_Test;   { Copyright (c) 1990-1992 Norbert Juffa }
  2.  
  3. {$A+,B-,D+,E+,F-,I-,L-,N+,O-,R-,S-,V-}
  4. {$M 16384,0,655360}
  5.  
  6.  
  7. USES Math, Fun1_TP6;
  8.  
  9. VAR  RandomNr:   ARRAY [0..10760] OF REAL;
  10.      R, R2:      REAL;
  11.      X, Y,
  12.      MaxY:       EXTENDED;
  13.      I, J, L,
  14.      ErrCountY:  LONGINT;
  15.  
  16. CONST
  17.     {$IFDEF VER40}
  18.     Ver = '4.0';
  19.     {$ENDIF}
  20.     {$IFDEF VER50}
  21.     Ver = '5.0';
  22.     {$ENDIF}
  23.     {$IFDEF VER55}
  24.     Ver = '5.5';
  25.     {$ENDIF}
  26.     {$IFDEF VER60}
  27.     Ver = '6.0';
  28.     {$ENDIF}
  29.  
  30.  
  31. BEGIN
  32.    WriteLn;
  33.    WriteLn ('Testing for errors in the basic arithmetic operations of TP '+Ver);
  34.    WriteLn;
  35.    WriteLn ('There should be no errors reported and relative error should be below');
  36.    WriteLn (PowerOfTwo (-40), ' for all functions that are tested. The test ');
  37.    WriteLn ('will take some time to complete, especially when using the emulator.');
  38.    WriteLn ('─────────────────────────────────────────────────────────────────────');
  39.    RandSeed := 12345;
  40.    FOR L := 0 TO 10760 DO BEGIN
  41.       RandomNr [L] := Exp (Random * 87);
  42.    END;
  43.    ErrCountY := 0;
  44.    MaxY := 0;
  45.    FOR L := 1 TO 100000 DO BEGIN
  46.       X := RandomNr [L MOD 10739] + RandomNr [(L + 101) MOD 10753];
  47.       Y := Add_TP60 (RandomNr [L MOD 10739], RandomNr [(L + 101) MOD 10753]);
  48.       R := X;
  49.       R2:= Y;
  50.       IF (X <> Y) THEN BEGIN
  51.          IF Abs ((Y-X) / X) > MaxY THEN
  52.             MaxY := Abs ((Y-X) / X);
  53.          IF (R <> R2) THEN
  54.             Inc (ErrCountY);
  55.          END;
  56.    END;
  57.    WriteLn ('errors in addition:');
  58.    WriteLn;
  59.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 1000.0:5:4, '%    ');
  60.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  61.    WriteLn;
  62.    WriteLn;
  63.    MaxY := 0;
  64.    ErrCountY := 0;
  65.    FOR L := 1 TO 100000 DO BEGIN
  66.       X := RandomNr [L MOD 10739] - RandomNr [(L + 101) MOD 10753];
  67.       Y := Sub_TP60 (RandomNr [L MOD 10739], RandomNr [(L + 101) MOD 10753]);
  68.       R := X;
  69.       R2:= Y;
  70.       IF (X <> Y) THEN BEGIN
  71.          IF Abs ((Y-X) / X) > MaxY THEN
  72.             MaxY := Abs ((Y-X) / X);
  73.          IF (R <> R2) THEN
  74.             Inc (ErrCountY);
  75.          END;
  76.    END;
  77.    WriteLn ('errors in subtraction: ');
  78.    WriteLn;
  79.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 1000.0:5:4, '%    ');
  80.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  81.    WriteLn;
  82.    WriteLn;
  83.  
  84.    FOR L := 0 TO 10760 DO BEGIN
  85.       RandomNr [L] := Exp (Random * 43) * (Random - 1);
  86.       IF RandomNr [L] = 0 THEN
  87.          RandomNr[L] := 0.1;
  88.    END;
  89.    MaxY := 0;
  90.    ErrCountY := 0;
  91.    FOR L := 1 TO 100000 DO BEGIN
  92.       X := RandomNr [L MOD 10739] * RandomNr [(L + 101) MOD 10753];
  93.       Y := Mul_TP60 (RandomNr [L MOD 10739], RandomNr [(L + 101) MOD 10753]);
  94.       R := X;
  95.       R2:= Y;
  96.       IF (X <> Y) THEN BEGIN
  97.          IF Abs ((Y-X) / X) > MaxY THEN
  98.             MaxY := Abs ((Y-X) / X);
  99.          IF (R <> R2) THEN
  100.             Inc (ErrCountY);
  101.          END;
  102.    END;
  103.    WriteLn ('errors in multiplication: ');
  104.    WriteLn;
  105.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 1000.0:5:4, '%    ');
  106.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  107.    WriteLn;
  108.    WriteLn;
  109.    MaxY := 0;
  110.    ErrCountY := 0;
  111.    FOR L := 1 TO 10760 DO BEGIN
  112.       X := Sqr (RandomNr [L]);
  113.       Y := Sqr_TP60 (RandomNr [L]);
  114.       R := X;
  115.       R2:= Y;
  116.       IF (X <> Y) THEN BEGIN
  117.          IF Abs ((Y-X) / X) > MaxY THEN
  118.             MaxY := Abs ((Y-X) / X);
  119.          IF (R <> R2) THEN
  120.             Inc (ErrCountY);
  121.          END;
  122.    END;
  123.    WriteLn ('errors in squaring: ');
  124.    WriteLn;
  125.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  126.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  127.    WriteLn;
  128.    WriteLn;
  129.    MaxY := 0;
  130.    ErrCountY := 0;
  131.    FOR L := 1 TO 50000 DO BEGIN
  132.       X := RandomNr [L MOD 10739] * Trunc (RandomNr [(L + 101) MOD 10753] / 8e13);
  133.       Y := Mul_TP60 (RandomNr [L MOD 10739], Trunc (RandomNr [(L + 101) MOD 10753]/8e13));
  134.       R := X;
  135.       R2:= Y;
  136.       IF (X <> Y) THEN BEGIN
  137.          IF Abs ((Y-X) / X) > MaxY THEN
  138.             MaxY := Abs ((Y-X) / X);
  139.          IF (R <> R2) THEN
  140.             Inc (ErrCountY);
  141.          END;
  142.    END;
  143.    FOR L := 1 TO 50000 DO BEGIN
  144.       X := Trunc (RandomNr [(L + 101) MOD 10739] / 8e13) *RandomNr [L MOD 10753];
  145.       Y := Mul_TP60 (Trunc (RandomNr [(L + 101) MOD 10739]/8e13),RandomNr [L MOD 10753]);
  146.       R := X;
  147.       R2:= Y;
  148.       IF (X <> Y) THEN BEGIN
  149.          IF Abs ((Y-X) / X) > MaxY THEN
  150.             MaxY := Abs ((Y-X) / X);
  151.          IF (R <> R2) THEN
  152.             Inc (ErrCountY);
  153.          END;
  154.    END;
  155.    WriteLn ('errors in SHORT-multiplication: ');
  156.    WriteLn;
  157.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 1000.0:5:4, '%    ');
  158.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  159.    WriteLn;
  160.    WriteLn;
  161.    MaxY := 0;
  162.    ErrCountY := 0;
  163.    FOR L := 1 TO 10760 DO BEGIN
  164.       X := Sqr (1.0*Trunc(RandomNr [L] / 8e13+1));
  165.       Y := Sqr_TP60 (Trunc(RandomNr [L] / 8e13+1));
  166.       R := X;
  167.       R2:= Y;
  168.       IF (X <> Y) and (X <> 0) THEN BEGIN
  169.          IF Abs ((Y-X) / X) > MaxY THEN
  170.             MaxY := Abs ((Y-X) / X);
  171.          IF (R <> R2) THEN
  172.             Inc (ErrCountY);
  173.          END;
  174.    END;
  175.    WriteLn ('errors in squaring (Short): ');
  176.    WriteLn;
  177.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  178.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  179.    WriteLn;
  180.    WriteLn;
  181.    MaxY := 0;
  182.    ErrCountY := 0;
  183.    FOR L := 1 TO 100000 DO BEGIN
  184.       X := RandomNr [L MOD 10739] / RandomNr [(L + 101) MOD 10753];
  185.       Y := Div_TP60 (RandomNr [L MOD 10739], RandomNr [(L + 101) MOD 10753]);
  186.       R := X;
  187.       R2:= Y;
  188.       IF (X <> Y) THEN BEGIN
  189.          IF Abs ((Y-X) / X) > MaxY THEN
  190.             MaxY := Abs ((Y-X) / X);
  191.          IF (R <> R2) THEN
  192.             Inc (ErrCountY);
  193.          END;
  194.    END;
  195.    WriteLn ('errors in division: ');
  196.    WriteLn;
  197.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 1000.0:5:4, '%    ');
  198.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  199.    WriteLn;
  200.    WriteLn;
  201.    MaxY := 0;
  202.    ErrCountY := 0;
  203.    FOR L := 1 TO 10760 DO BEGIN
  204.       X := Int (RandomNr [L]) + Frac (RandomNr [L]);
  205.       Y := Int_TP60 (RandomNr [L]) + Frac_TP60 (RandomNr [L]);
  206.       R := X;
  207.       R2:= Y;
  208.       IF (X <> Y) THEN BEGIN
  209.          IF Abs ((Y-X) / X) > MaxY THEN
  210.             MaxY := Abs ((Y-X) / X);
  211.          IF (R <> R2) THEN
  212.             Inc (ErrCountY);
  213.          END;
  214.    END;
  215.    WriteLn ('errors in Int / Frac: ');
  216.    WriteLn;
  217.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  218.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  219.    WriteLn;
  220.    WriteLn;
  221.    MaxY := 0;
  222.    ErrCountY := 0;
  223.    FOR L := 1 TO 10760 DO BEGIN
  224.       RandomNr [L] := RandomNr [L] /2.5e9;
  225.       X := Trunc (RandomNr [L]);
  226.       Y := Float_TP60 (Trunc_TP60 (RandomNr [L]));
  227.       R := X;
  228.       R2:= Y;
  229.       IF (X <> Y) THEN BEGIN
  230.          IF Abs ((Y-X) / X) > MaxY THEN
  231.             MaxY := Abs ((Y-X) / X);
  232.          IF (R <> R2) THEN
  233.             Inc (ErrCountY);
  234.          END;
  235.    END;
  236.    WriteLn ('errors in Trunc / Float: ');
  237.    WriteLn;
  238.    Write   ('Turbo-Pascal '+Ver+': ', ErrCountY / 107.6:5:4, '%    ');
  239.    WriteLn ('(max. relative error:   ', MaxY:18, ')');
  240.    WriteLn;
  241. END. { Fun1_Test }
  242.